/**
 * UI日志采样策略
 *
 * @fileoverview 控制UI层日志的采样和数量限制
 */

/**
 * 关键步骤列表（始终记录）
 */
const KEY_STEPS = [
  'startBooking',
  'complete',
  'error',
  'start',
  'success',
]

/**
 * 上次日志时间记录（用于采样控制）
 */
const lastLogTimes = new Map<string, number>()

/**
 * 日志采样间隔（毫秒）
 * 普通步骤每3秒最多记录1条
 */
const LOG_INTERVAL_MS = 3000

/**
 * 最大日志数量限制
 */
const MAX_LOG_COUNT = 50

/**
 * 检查是否应该记录此日志
 *
 * @param stepName - 步骤名称
 * @param isKeyStep - 是否为关键步骤（可选，自动判断）
 * @returns 是否应该记录
 */
export function shouldLogUserStep(stepName: string, isKeyStep?: boolean): boolean {
  // 关键步骤始终记录
  if (isKeyStep !== undefined ? isKeyStep : KEY_STEPS.includes(stepName)) {
    return true
  }

  // 普通步骤：检查时间间隔
  const now = Date.now()
  const lastTime = lastLogTimes.get(stepName) || 0

  if (now - lastTime >= LOG_INTERVAL_MS) {
    lastLogTimes.set(stepName, now)
    return true
  }

  return false
}

/**
 * 限制日志数组的长度
 *
 * @param logs - 日志数组
 * @param maxCount - 最大数量（默认50）
 * @returns 裁剪后的日志数组
 */
export function trimLogs(logs: any[], maxCount: number = MAX_LOG_COUNT): any[] {
  if (logs.length <= maxCount) {
    return logs
  }

  // 保留最近的日志，但确保至少保留一条关键步骤日志
  const trimmed = logs.slice(-maxCount)

  // 如果有start日志但被裁剪掉了，确保保留第一条
  const startLog = logs.find((log: any) => log.step === 'startBooking' || log.step === 'start')
  if (startLog && !trimmed.includes(startLog)) {
    trimmed[0] = startLog
  }

  return trimmed
}

/**
 * 清除采样时间记录（用于测试或重置）
 */
export function clearSamplingCache(): void {
  lastLogTimes.clear()
}
